from utils.Spider import Spider
from typing import Dict, List, Tuple, Optional, Any ,Union,Callable # 这里必须包含 Any
import json

from db.mysql_handler import MySQLConfig,MySQLHandler
from datetime import datetime #日期时间类
import hashlib


music_url = "http://music.2t58.com/"

def spider_m():
    # 初始化爬虫
    spider = Spider(
        retry_times=2,
        random_delay=(1, 2)  # 每次请求前随机延迟1-2秒
    )

    def parse_list(html: str) -> Optional[str]:
        soup = spider.parse_html(html)
        result = []
        li_tag = soup.select('.ilingkuplay_list > ul li div.name a')
        # 2. 遍历每个 li，只提取 class="name" 的 div 下的 a 标签
        for a in li_tag:
            href = a.get('href')
            title = a.get('title')
            if href and title:  # 过滤掉 href 或 title 为空的无效数据
                result.append({
                    'href': href,
                    'title': title
                })
            else:
                print(f"警告：发现无效 a 标签，href={href}, title={title}")
                # 打印结果

        print(result)

        # for item in result:
        #     # 计算起始索引（"/song/" 的长度为 6，因此从索引 6 开始）
        #     start = len("/song/")  # 结果为 6

        #     # 计算结束索引（找到 ".html" 的起始位置）
        #     end = item['href'].find(".html")  # 结果为 6 + len("d2tteGRk") = 13

        #     # 截取中间部分
        #     music_id = item['href'][start:end]
        #     print(f"href: {item['href']}, title: {item['title']}")

    spider.crawl(music_url, parse_list)

if __name__ == "__main__":
    # spider_m()
    # 读取文件并解析成列表
    with open("data.json", "r", encoding="utf-8") as f:
        result = json.load(f)  # 直接解析为列表


    # print(result)
    music_arr = [] #数组格式 用于存放 存到数据库中的数据
    for item in result:
        current_time = datetime.now() #获取当前时间 年月日时分秒
        music_id = hashlib.md5(item['href'].encode('utf-8')).hexdigest() #获取唯一id 使用md5方式
        # item['src'] = music_id
        item['bindId'] = music_id #新增键值对
        item['ctime'] = current_time #新增键值对
        music_arr.append(item) #将单个数据的结果添加到数组中

    # 将数据添加到数据库中 使用try 捕获异常 如果其中的代码有错误则抛出异常 终止插入数据库
    try:
        # 1. 初始化配置（指定配置文件路径和数据库节点）
        # 注意：根据你的实际config.ini路径修改（相对或绝对路径）
        config_path = "config/config.ini"  # 假设config.ini与当前文件同目录
        db_config = MySQLConfig(config_path=config_path, section="mysql_dev")

        # 2. 创建数据库处理器
        db_handler = MySQLHandler(db_config);


        # 3. 设置表名（会自动添加配置中的前缀）
        music_table = 'music'
        db_handler.set_table(music_table)

         # 开始事务
        if not db_handler.start_transaction():
            raise Exception("无法开始事务")
        
        
        res = db_handler.insert_or_update_many(music_arr,'bindId')
        print(res)

        # 提交事务
        if not db_handler.commit_transaction():
            raise Exception("事务提交失败")
        print("事务执行成功")


    except Exception as e:
        print(f"事务执行失败，进行回滚：{e}")
        db_handler.rollback_transaction()
    finally:
        # 自动断开连接（__del__方法也会处理，但显式调用更保险）
        if 'db_handler' in locals():
            db_handler.disconnect()